Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

docker运行nginx

学习docker

简介

docker是为了简化外网服务器软件环境部署的工作。现在初浅的理解是,可以在linux机器上通过docker单独安装mysql,nginx,应用程序的也可以跑在一个docker之上。

  • Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

安装

使用脚本一口气安装好。

1
2
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh

参考了腾讯在线实验 菜鸟入门 可以很快速的将docker部署到你的服务器上。

  • 可能需要卸载掉老的docker
1
2
3
4
5
6
7
8
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  • 设置仓库
1
2
3
4
5
6
7
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
  • 安装
1
sudo yum install docker-ce docker-ce-cli containerd.io

安装完成之后,可以通过docker -v来查看当前docker的版本信息。

  • 使用国内加速

创建或修改 /etc/docker/daemon.json 文件

1
2
3
4
5
6
7
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}

基本操作

  • 运行一个容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sudo systemctl start docker
sudo systemctl enable docker
# 2024-02-28 现在版本使用 8.3.0
# 而且需要使用非常复杂的密码,防止其他的人攻入,就在下面有生成密码的脚本
docker run -p 3306:3306 --name mysqltest -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=asA~r%apOWEd$_9d -d mysql:8.3.0

- 查询容器

docker ps -a

- 使用 docker start 启动一个已停止的容器:

docker start b750bbbcfd88

- 后台运行 (增加-d的指令)

docker run -itd --name ubuntu-test ubuntu /bin/bash

- 停止一个容器

docker stop <容器 ID>

- 进入容器

docker attach 如果从这个容器退出,会导致容器的停止。

docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

docker attach 1e560fca3906
docker exec -it 243c32535da7 bash


- 导出和导入容器

docker export 1e560fca3906 > ubuntu.tar

- 导入容器快照

cat docker/ubuntu.tar | docker import - test/ubuntu:v1

- 下面的命令可以清理掉所有处于终止状态的容器。

docker container prune

密码生成脚本

1
2
3
4
5
6
7
8
import random
import string

letters = string.ascii_lowercase
letters += string.ascii_uppercase
letters += string.digits
letters += '~!@#$%A*-_=+?,()&'
print ( ''.join(random.choice(letters) for i in range(16)) )

更多指令可以后续补充

安装mysql

参考菜鸟入门mysql安装
使用Docker搭建MySQL服务

1
2
3
4
5
6
7
8
9
10
11
## 拉取mysql5.7版本
docker pull mysql:5.7 # 拉取 mysql 5.7
## 检查版本
docker images
## 启动mysql
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

- -–name:容器名,此处命名为mysql
- -e:配置信息,此处配置mysql的root用户的登陆密码
- -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
- -d:源镜像名,此处为 mysql:5.7

设置docker的子目录

1
2
3
4
5
6
docker run -d -p 3306:3306 --name my_mariadb -v /data/mariadb/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mariadb:lastest

docker pull mysql:latest
docker run -itd --name shuihuDB -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

在驱动属性中,将“allowPublicKeyRetrieval”设置为true即可

将本地端口 3306 映射到 docker 端口 3306

安装nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
## 拉取版本
docker pull nginx:latest
## 检查版本
docker images
## 启动docker中的nginx
docker run --name nginx-test -p 8080:80 -d nginx

- --name nginx-test:容器名称。
- -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
- -d nginx: 设置容器在在后台一直运行。

可能需要去修改nginx里面的配置项目,我需要将这个服务器端口映射出来。
[docker 安装nginx 并部署](https://blog.csdn.net/ddhsea/article/details/92203713。
里面有3个步骤

## 在自己目录下创建这些文件夹
mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
## 将容器中的nginx文件拷贝出来,通过docker ps出来实例编号。
sudo docker cp 3bd71361a112:/etc/nginx/nginx.conf ~/nginx/conf
## 启动的时候,绑定映射关系
docker run --name yzgmweb -d -p 35981:8088 \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf\
-v /root/nginx/www:/usr/share/nginx/html\
-v /root/nginx/logs:/var/log/nginx -d docker.io/nginx

-p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 将本地文件映射到容器内部。

➜ ~ docker run -d -p 6379:6379 --name redis-9 -d redis
16c1db84bc5156c099bf476e83d1951398615e2819c94cfdf041ec8fd5c37284
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16c1db84bc51 redis "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:6381->6379/tcp, :::6381->6379/tcp redis-9
6af8e5268b90 redis "docker-entrypoint.s…" 6 days ago Up 6 days 0.0.0.0:6380->6379/tcp, :::6380->6379/tcp redis-10

扩展

后续如果有时间,可以再去研究一下 docker compose & swarm;dockerfile之类的东西。再做记录。

修改docker ulimit

1
2
3
[How to increase number of open files limit]](<https://mtyurt.net/post/docker-how-to-increase-number-of-open-files-limit.html>)

docker run --ulimit nofile=90000:90000 <image-tag>

服务器的网络ip地址修改了之后,需要重启docker

直接通过docker搭建centos7的环境,会安装一些必要的工具

1
2
docker pull centos:7
docker run -it --name="abel_centos7" --user root -p 2200:22 --privileged=true --cap-add=SYS_PTRACE --cap-add=SYS_TIME --security-opt seccomp=unconfined centos:7 /bin/bash

报错

安装时错误

1
2
System.InvalidOperationException:
Failed to set version to docker-desktop: exit code: -1

使用管理员执行一次netsh winsock reset

1
2
3
4
PS C:\Windows\system32> netsh winsock reset

成功地重置 Winsock 目录。
你必须重新启动计算机才能完成重置。

启动报错

Reached end of stream before finding a line seperator

这个是由于现在没有足够的资源启动服务器。

利用nginx反向代理解决跨域的问题

先使用指令将一个docker Nginx部署出来

1
2
3
4
5
6
7
8
9
10
## 创建存放位置
mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf/conf.d
## 将目录映射给本地目录
docker run \
--name nginx1.15 \
-p 3009:80 \-v /opt/nginx/config/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d \
-v ~/nginx/logs:/var/log/nginx \
-v ~/nginx/www:/usr/share/nginx \
-d nginx

意图就是如果访问根的时候,就去读取资源信息,如果访问了/api/的东西,将会去掉/api/前缀,保持参数不动专发给内部的服务器,这样就不会有跨域的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

server{
listen 80;
server_name 你的域名;

location / {
root /usr/share/nginx/html/静态页面位置;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}

location ~* /api/ {
rewrite ^/api/(.*)$ /$1 break; # 使用sed将api字样去掉,然后转发给本地服务器
proxy_pass http://宿主机器的地址:12013; # 172.17.0.1
}
}

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in
地址不能支持
http://106.14.27.130:3009/api/ 结束的地方/符号。

nginx.conf下载

default.conf下载

ubuntu安装

https://www.runoob.com/docker/ubuntu-docker-install.html

1
2
3
4
5
6
7
8
9
10
11
12

# 如果没有 docker 组,就通过这个指令来创建组
sudo groupadd docker

1. 将当前用户加入docker组

$ sudo usermod -a -G docker $(whoami)

2. 修改 /var/run/docker.sock 的权限

$ sudo chmod 666 /var/run/docker.sock

docker随系统启动

docker-run命令详解这个页面下面搜索Restart policies (--restart)

实例:docker run --restart=always redis.

The following example starts a Redis container and configures it to always restart unless it is explicitly stopped or Docker is restarted.

docker run -d —restart unless-stopped redis

This command changes the restart policy for an already running container named redis.

docker update —restart unless-stopped redis

可选值:
no:不自动重启容器。
on-failure[:max-retries]:在容器失败时自动重启,可选指定最大重试次数。
unless-stopped:除非明确停止容器,否则在容器退出时自动重启。
always:无论容器以何种方式退出,均自动重启。

docker 需要创建用户组

1
2
groupadd docker
gpasswd -a franky docker

https://blog.csdn.net/carefree2005/article/details/121427448

docker Dockerfile 创建 image 最后跑起来

1
2
3
4
5
# 通过 Dockerfile 定义的规则,构建一个image,可以取名字
docker build -t your-node-image-name .
# 将一个镜像跑起来
docker image list
docker run --name docker-name -d your-node-image-name

docker 已经在运行的镜像如何修改暴露的端口

重新分配端口

1
2
3
4
5
6
7
8
# 查看当前启动的 docker 实例
docker ps
# 关闭掉实例
docker stop <container_id>
# 将停下来的 container 转换成 image
docker commit <container_id> your-name-container-name
# 重新将 image 部署出来
docker run -d -p 主机端口:docker内部端口 --name your-name-container-name container-name

清理掉已经删除掉的docker 对应的 volume

1
2
3
4
5
6
7
8
# 先通过命令找出当前跑的全部 container . 第一列就是 container id。我们可以使用这个container id 继续查询出对应的 volume
docker ps
# 将会输出关联的 volume,这个其实类似于 jq 工具,对于返回的 json 做一些 grep 操作,返回自己想要看的字段。
docker inspect -f '{{ .Mounts }}' <container-id>
# 我们可以直接在硬盘里面这个目录找到这些 volume 来看
/var/lib/docker/volumes
# 筹划一下就能去清理自己的机器里面一些垃圾的volume文件了。
docker volume ls|rm

修改docker映射端口

不仅仅是dockerfile里面需要暴露端口,而且在run的时候,需要将端口指定出来。

modify-port

-modify-port

使用修改配置文件的方式来搞定这个事情。

我们对比一下设置正常的redis配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"Config": {
"ExposedPorts": {
// dokefile将会指定哪些端口需要暴露
"6379/tcp": {}
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "171c94c6fad95edc4bfd0d0c2a6fdfb722ddd63383e317ae82b92d18a46ee9b4",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
// 如何将端口映射到宿主机
"6379/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "6379"
},
{
"HostIp": "::",
"HostPort": "6379"
}
]
}
}
}

具体操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 关闭机器上全部的docker
docker stop <container-id>
# 停掉docker服务
systemctl stop docker
systemctl stop docker.socket
# Warning: Stopping docker.service, but it can still be activated by:
# docker.socket
# 找到docker的配置文件修改
/var/lib/docker/containers/{cotainer ID+ hash}/hostconfig.json
# 具体到这个文件只需要修改这里:
# "PortBindings":{"6620/tcp":[{"HostIp":"","HostPort":"6620"}]},
# 注意这个文件和刚刚我们inspect看到的json格式是不相同的。
# 的确能搞定事情。

安装PostgreSQL14

1
docker run --name my-postgreSQL -e POSTGRES_PASSWORD=12345678 -e POSTGRESQL_USER=postgres -e POSTGRESql_DB=mydatabase -p 5432:5432 -d postgres:14

查看docker里面的日志

初次使用docker的时候,发现无法使用 grep 。

docker-logs-commandline

docker logs nginx 2>&1

stackoverflow-finding-a-string-in-docker-logs

I wonder if the docker logs command itself prints to stderr instead of stdout. –
Code-Apprentice

this can happen if the container is logging to stderr, piping works only for stdout, so try:

docker logs nginx 2>&1 | grep “127.”

“2>&1” will tells the shell to redirect stderr to stdout and give the output to grep using pipe.

docker logs -f -n 10 container_name | grep ‘height=’

使用dockerfile编译成image

1
docker build -f Dockerfile -t bsc-image .

使用 docker-compose 部署一套 nginx

https://cloudinfrastructureservices.co.uk/install-nginx-with-docker-compose/

PostgreSQL

https://www.commandprompt.com/education/how-to-install-and-set-up-docker-postgresql-environment/

1
docker run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres

限制机器的cpu、带宽、内存(好像需要升级docker-compose才能用)*

暂时没有用起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run --cpus=2 my_image
docker run --cpuset-cpus="0-1" my_image
docker run --memory=4g my_image
docker run --limit-bandwidth=2m my_image

# https://stackoverflow.com/questions/42345235/how-to-specify-memory-cpu-limit-in-docker-compose-version-3


# 安装最新版本的docker-compose
# curl + grep
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')

# curl + jq
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)

DESTINATION=/usr/local/bin/docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION
sudo chmod 755 $DESTINATION
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

设置 valoume

docker run —volume 主机地址:宿机地址 -p 主机端口:宿机端口 —name container名称 -d image名称

通过 network 命令打通两个 docker container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个network,其中有很多中模式,默认就是bridge
docker network create prometheus_grafana
# 下面需要指定启动docker将使用这个network
docker run -itd --name=docker_prometheus --network prometheus_grafana --restart=always -p 9090:9090 prom/prometheus
docker run -itd --name=grafana --network prometheus_grafana \
--restart=always \
-p 3000:3000 \
-v /data/grafana-storage:/var/lib/grafana \
grafana/grafana
# 查看已经注册在这个network的container
docker network inspect prometheus_grafana
后续可以根据里面查询到的名字,互相配置名字去访问;

prometheus 的一个比较好的模板

输入12884,点击 load

将 docker 编译出来,并且运行起来;

1
docker build -t spider_image:v1  .

从docker中拷贝进出文件

1
2
3
4
docker cp docker_prometheus:/etc/prometheus/prometheus.yml $PWD
docker cp $PWD/prometheus.yml docker_prometheus:/etc/prometheus/prometheus.yml

其实 docker 的文件就能自己去找到一些目录,并且删除掉一些文件;

使用 docker-compose

https://github.com/docker/compose/releases/tag/v2.23.1

下载然后复制到:

sudo mv ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose

ubuntu 如何安装 docker

https://www.runoob.com/docker/ubuntu-docker-install.html

docker image 常用

要共享 Docker 镜像给其他机器,通常有几个步骤,主要涉及到保存镜像、传输镜像文件以及在目标机器上加载镜像。以下是一些方法:

方法一:使用 Docker Hub

  1. 保存镜像: 如果你的镜像已经构建并且你有 Docker Hub 账号,可以使用以下命令将镜像保存为 tar 文件:

    1
    docker save -o my-golang-app.tar my-golang-app
  2. 上传到 Docker Hub: 使用 docker push 命令将保存的 tar 文件上传到 Docker Hub。

    1
    2
    3
    docker login   # 登录到 Docker Hub
    docker tag my-golang-app <你的用户名>/my-golang-app:版本号
    docker push <你的用户名>/my-golang-app:版本号
  3. 在其他机器上拉取镜像: 在其他机器上,登录到 Docker Hub 并拉取你的镜像。

    1
    2
    docker login
    docker pull <你的用户名>/my-golang-app:版本号

方法二:使用本地文件

  1. 保存镜像: 使用 docker save 命令将镜像保存为 tar 文件。

    1
    docker save -o my-golang-app.tar my-golang-app
  2. 传输文件: 将保存的 tar 文件传输到目标机器,可以使用 scp、rsync 等工具。

    1
    scp my-golang-app.tar user@remote-machine:/path/to/destination
  3. 加载镜像: 在目标机器上,使用 docker load 命令加载保存的 tar 文件。

    1
    docker load -i /path/to/destination/my-golang-app.tar

方法三:使用 Docker 镜像仓库

  1. 使用私有 Docker 镜像仓库: 如果你有一个私有 Docker 镜像仓库(比如 Harbor、Nexus 等),可以将镜像推送到私有仓库,然后在其他机器上拉取。

  2. 在其他机器上拉取镜像: 在其他机器上,使用 docker pull 命令从私有仓库拉取镜像。

无论你选择哪种方法,都需要在目标机器上确保已经安装 Docker,并且具有适当的权限。通过上述步骤,你就能在不同机器上轻松共享和使用相同的 Docker 镜像。

如何使用命令行将某个容器的network切换

1
2
3
4
5
docker stop node_exporter
docker network ls
docker network disconnect node_exporter_default node_exporter
docker network connect prometheus-component_prom node_exporter
docker start node_exporter

/var/log/journal 目录通常是由 systemd 日志守护进程(systemd-journald)使用的,用于存储二进制日志文件。这些日志文件可能会占用大量的磁盘空间,因此有时候需要清理。

要清理 /var/log/journal 目录,可以按照以下步骤操作:

1. 检查当前日志的使用情况

首先,检查当前日志的磁盘使用情况:

1
sudo journalctl --disk-usage

这会显示当前日志文件占用的空间大小。

2. 清理旧的日志文件

你可以使用 journalctl 命令来清理旧的日志文件。例如,保留最近7天的日志,删除其他的:

1
sudo journalctl --vacuum-time=7d

你还可以通过指定最大占用空间来清理日志文件。例如,保留不超过100M的日志文件:

1
sudo journalctl --vacuum-size=100M

3. 手动删除

如果需要手动删除日志文件,你可以直接删除 /var/log/journal 目录中的文件:

1
sudo rm -rf /var/log/journal/*

请注意,手动删除可能会导致日志服务中断,因此一般建议使用 journalctl 提供的清理命令。

4. 配置自动清理

你还可以配置 systemd-journald 自动清理日志文件。在 /etc/systemd/journald.conf 文件中进行配置,例如:

1
2
3
4
[Journal]
SystemMaxUse=100M
SystemMaxFileSize=10M
MaxRetentionSec=1month

然后重启 systemd-journald 服务以使配置生效:

1
sudo systemctl restart systemd-journald

通过这些步骤,你可以有效地管理和清理 /var/log/journal 目录中的日志文件。
/var/lib/docker/overlay2 目录是 Docker 用于存储容器镜像和容器层文件系统的一个关键目录。具体来说,overlay2 是一种存储驱动程序,它使用 Linux 内核的 OverlayFS 文件系统来高效地管理和存储 Docker 镜像和容器。

主要功能

  1. 镜像层存储

    • Docker 镜像由多个只读层组成,每个层代表镜像的一个历史状态。
    • overlay2 存储驱动程序将这些层存储在 /var/lib/docker/overlay2 目录中,并通过 OverlayFS 文件系统将它们组合在一起。
  2. 容器层存储

    • 当你启动一个容器时,Docker 会为该容器创建一个可写层,并将其放置在 /var/lib/docker/overlay2 目录中。
    • 这个可写层允许容器在运行时进行文件系统操作,而不会修改底层只读镜像层。
  3. 写时复制(Copy-on-Write)

    • overlay2 存储驱动程序通过写时复制机制来实现文件系统的高效管理。当容器需要修改一个文件时,只有该文件被复制到可写层中进行修改,而其他未修改的文件仍然从只读层读取。

目录结构

/var/lib/docker/overlay2 目录中,你会看到许多子目录和文件,这些子目录通常是以长字符串(如哈希值)命名的。每个子目录代表一个 Docker 镜像层或容器层。具体结构如下:

  • diff 目录:包含层的实际文件系统内容。
  • link 目录:用于快速查找层。
  • merged 目录:用于挂载点,显示合并后的文件系统视图。
  • work 目录:用于 OverlayFS 的临时工作目录。
  • lower 文件:包含底层只读层的信息。

清理与管理

由于 Docker 镜像和容器的数据存储在这个目录中,随着时间的推移,这个目录可能会占用大量的磁盘空间。可以使用以下命令来清理未使用的镜像和容器:

  1. 清理未使用的容器

    1
    docker container prune
  2. 清理未使用的镜像

    1
    docker image prune
  3. 清理所有未使用的对象(包括镜像、容器、网络等)

    1
    docker system prune

通过定期清理未使用的 Docker 对象,你可以有效地管理 /var/lib/docker/overlay2 目录的磁盘使用情况。

即使清理了未使用的 Docker 对象,有时 /var/lib/docker/overlay2 目录仍然会占用大量空间。这可能是因为某些未被清理的层或镜像仍然占据磁盘空间。以下是一些进一步的步骤,帮助你释放更多空间:

1. 检查占用空间的 Docker 对象

首先,可以检查每个 Docker 对象占用的空间:

1
docker system df

这会显示镜像、容器、卷和构建缓存的磁盘使用情况。

2. 删除未使用的卷

有时 Docker 卷可能会占用大量空间,可以删除未使用的卷:

1
docker volume prune

3. 删除悬挂的镜像(Dangling Images)

这些是构建过程中产生但未被标记的镜像:

1
docker image prune -a

此命令会删除所有未被容器使用的镜像,包括悬挂的镜像。

4. 删除特定的镜像或容器

检查特定镜像和容器的大小,并手动删除不再需要的镜像和容器。例如,要删除一个特定的镜像:

1
docker rmi IMAGE_ID

要删除一个特定的容器:
1
docker rm CONTAINER_ID

5. 检查构建缓存

Docker 在构建镜像时会使用构建缓存,可以通过以下命令清理:

1
docker builder prune

6. 检查和删除未使用的网络

未使用的 Docker 网络也会占用一些空间:

1
docker network prune

7. 手动清理 /var/lib/docker/overlay2

如果上述方法仍然不能释放足够的空间,可以手动检查和清理 /var/lib/docker/overlay2 目录中的文件和目录。需要非常小心,以免删除重要的数据。

步骤:

  1. 停止 Docker 服务

    1
    sudo systemctl stop docker
  2. 检查并删除无效的目录
    可以手动检查和删除一些未使用或无效的目录。这些目录通常是以长字符串命名的,可以通过查找一些异常大的目录来确定是否需要删除。

    1
    sudo du -sh /var/lib/docker/overlay2/* | sort -h

    根据输出结果,手动删除占用空间异常大的无效目录。

  3. 重启 Docker 服务

    1
    sudo systemctl start docker

8. 考虑使用更大或额外的存储设备

如果上述方法都无法满足需求,可以考虑增加存储空间或将 Docker 数据目录移动到更大的存储设备。

更改 Docker 数据目录:

  1. 停止 Docker 服务

    1
    sudo systemctl stop docker
  2. 复制数据到新目录

    1
    sudo cp -r /var/lib/docker /path/to/new/docker
  3. 更新 Docker 配置文件
    编辑 /etc/docker/daemon.json 文件,添加或修改以下内容:

    1
    2
    3
    {
    "data-root": "/path/to/new/docker"
    }
  4. 重启 Docker 服务

    1
    sudo systemctl start docker

通过以上步骤,你应该能够更好地管理和释放 /var/lib/docker/overlay2 目录的磁盘空间。如果还有其他问题,欢迎随时咨询。

可能还需要重启服务器一次。

引用